home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / jrh-rkrm-partone / commodities / popshell.e < prev   
Text File  |  1995-04-01  |  6KB  |  154 lines

  1. -> PopShell.e - Simple hot key commodity
  2.  
  3. OPT PREPROCESS  -> E-Note: we are using the CxXXX creation macros
  4.  
  5. MODULE 'commodities',
  6.        'icon',
  7.        'amigalib/argarray',
  8.        'amigalib/cx',
  9.        'devices/timer',
  10.        'devices/inputevent',
  11.        'dos/dos',
  12.        'exec/ports',
  13.        'libraries/commodities'
  14.  
  15. ENUM ERR_NONE, ERR_ARGS, ERR_BRKR, ERR_CRCX, ERR_CXERR, ERR_HOT, ERR_IE,
  16.      ERR_LIB,  ERR_PORT
  17.  
  18. RAISE ERR_BRKR IF CxBroker()=NIL,
  19.       ERR_CRCX IF CreateCxObj()=NIL,  -> E-Note: the CxXXX macros use this
  20.       ERR_LIB  IF OpenLibrary()=NIL,
  21.       ERR_PORT IF CreateMsgPort()=NIL
  22.  
  23. CONST EVT_HOTKEY=1
  24.  
  25. DEF broker_mp=NIL:PTR TO mp, broker=NIL, filter=NIL,
  26.     cxsigflag, ie=NIL:PTR TO inputevent
  27.  
  28. PROC main() HANDLE
  29.   DEF hotkey, ttypes=NIL, msg, newshell
  30.   -> E-Note: we can use invertStringRev(), so we don't need to spell backwards!
  31.   newshell:='newshell\b'
  32.   cxbase:=OpenLibrary('commodities.library', 37)
  33.   iconbase:=OpenLibrary('icon.library', 36)
  34.   broker_mp:=CreateMsgPort()
  35.   cxsigflag:=Shl(1, broker_mp.sigbit)
  36.   -> E-Note: argArrayInit() uses global "wbmessage" and "arg" by default
  37.   -> E-Note: C version fails to check return value
  38.   IF NIL=(ttypes:=argArrayInit()) THEN Raise(ERR_ARGS)
  39.   hotkey:=argString(ttypes, 'HOTKEY', 'rawkey control esc')
  40.  
  41.   broker:=CxBroker([NB_VERSION, 0,  -> E-Note: pad byte!
  42.                     'RKM PopShell',  -> String to identify this broker
  43.                     'A Simple PopShell',
  44.                     'A simple PopShell commodity',
  45.                     -> Don't want any new commodities starting with this name.
  46.                     -> If someone tries it, let me know
  47.                     NBU_UNIQUE OR NBU_NOTIFY,
  48.                     0, argInt(ttypes, 'CX_PRIORITY', 0),
  49.                     0, broker_mp, 0]:newbroker, NIL)
  50.  
  51.   -> hotKey() is an amigalib function that creates a filter, sender and
  52.   -> translate CxObject and connects them to report a hot key press and
  53.   -> delete its input event.
  54.   IF NIL=(filter:=hotKey(hotkey, broker_mp, EVT_HOTKEY)) THEN Raise(ERR_HOT)
  55.  
  56.   -> Add a CxObject to another's personal list
  57.   AttachCxObj(broker, filter)
  58.   IF CxObjError(filter)<>FALSE THEN Raise(ERR_CXERR)
  59.  
  60.   -> invertString() is an amigalib function that creates a linked list of input
  61.   -> events which would translate into the string passed to it.  Note that it
  62.   -> puts the input events in the opposite order in which the corresponding
  63.   -> letters appear in the string.  A translate CxObject expects them backwards.
  64.   -> E-Note: ...so use invertStringRev() and stay sane...
  65.   IF NIL=(ie:=invertStringRev(newshell, NIL)) THEN Raise(ERR_IE)
  66.  
  67.   ActivateCxObj(broker, TRUE)
  68.   processMsg()
  69.  
  70. EXCEPT DO
  71.   -> We have to release the memory allocated by invertStringRev.
  72.   -> E-Note: ...well, this isn't really necessary since it uses NEW
  73.   IF ie THEN freeIEvents(ie)
  74.   -> DeleteCxObjAll() is a commodities.library function that not only deletes
  75.   -> the CxObject pointed to in its argument, but deletes all of the CxObjects
  76.   -> attached to it.
  77.   IF broker THEN DeleteCxObjAll(broker)
  78.   -> This amigalib function cleans up after argArrayInit()
  79.   IF ttypes THEN argArrayDone()
  80.   IF broker_mp  -> Empty the port of all CxMsgs
  81.     WHILE msg:=GetMsg(broker_mp) DO ReplyMsg(msg)
  82.     DeleteMsgPort(broker_mp)
  83.   ENDIF
  84.   IF iconbase THEN CloseLibrary(iconbase)
  85.   IF cxbase THEN CloseLibrary(cxbase)
  86.   SELECT exception
  87.   CASE ERR_ARGS;   WriteF('Error: Could not parse tooltypes/arguments\n')
  88.   CASE ERR_BRKR;   WriteF('Error: Could not create broker\n')
  89.   CASE ERR_CRCX;   WriteF('Error: Could not create CX object\n')
  90.   CASE ERR_CXERR;  WriteF('Error: Could not activate broker\n')
  91.   CASE ERR_HOT;    WriteF('Error: Could not create hot key\n')
  92.   CASE ERR_LIB;    WriteF('Error: Could not open required library\n')
  93.   CASE ERR_PORT;   WriteF('Error: Could not create message port\n')
  94.   ENDSELECT
  95. ENDPROC
  96.  
  97. PROC processMsg()
  98.   DEF msg, sigrcvd, msgid, msgtype, done=FALSE
  99.   REPEAT
  100.     sigrcvd:=Wait(SIGBREAKF_CTRL_C OR cxsigflag)
  101.  
  102.     WHILE msg:=GetMsg(broker_mp)
  103.       msgid:=CxMsgID(msg)
  104.       msgtype:=CxMsgType(msg)
  105.       ReplyMsg(msg)
  106.  
  107.       SELECT msgtype
  108.       CASE CXM_IEVENT
  109.         WriteF('A CXM_EVENT, ')
  110.         SELECT msgid
  111.         CASE EVT_HOTKEY
  112.           -> We got the message from the sender CxObject
  113.           WriteF('You hit the HotKey.\n')
  114.           -> Add the string "newshell" to input * stream.  If a shell gets it,
  115.           -> it'll open a new shell.
  116.           AddIEvents(ie)
  117.         DEFAULT
  118.           WriteF('unknown.\n')
  119.         ENDSELECT
  120.       CASE CXM_COMMAND
  121.         WriteF('A command: ')
  122.         SELECT msgid
  123.         CASE CXCMD_DISABLE
  124.           WriteF('CXCMD_DISABLE\n')
  125.           ActivateCxObj(broker, FALSE)
  126.         CASE CXCMD_ENABLE
  127.           WriteF('CXCMD_ENABLE\n')
  128.           ActivateCxObj(broker, TRUE)
  129.         CASE CXCMD_KILL
  130.           WriteF('CXCMD_KILL\n')
  131.           done:=TRUE
  132.         CASE CXCMD_UNIQUE
  133.           -> Commodities Exchange can be told not only to refuse to launch a
  134.           -> commodity with a name already in use but also can notify the
  135.           -> already running commodity that it happened.  It does this by
  136.           -> sending a CXM_COMMAND with the ID set to CXMCMD_UNIQUE.  If the
  137.           -> user tries to run a windowless commodity that is already running,
  138.           -> the user wants the commodity to shut down.
  139.           WriteF('CXCMD_UNIQUE\n')
  140.           done:=TRUE
  141.         DEFAULT
  142.           WriteF('Unknown msgid\n')
  143.         ENDSELECT
  144.       DEFAULT
  145.         WriteF('Unknown msgtype\n')
  146.       ENDSELECT
  147.     ENDWHILE
  148.     IF sigrcvd AND SIGBREAKF_CTRL_C
  149.       done:=TRUE
  150.       WriteF('CTRL C signal break\n')
  151.     ENDIF
  152.   UNTIL done
  153. ENDPROC
  154.